using System;
using System.Collections.Generic;
using System.Text;

using Tao.OpenGl;

namespace tp2
{
    public class Cilindro
    {

        public static void Dibujar(Punto p1, Punto p2)
        {
            Dibujar(p1, p2, 0.05, 0.05, 10);
        }

        public static void Dibujar(Punto p1, Punto p2, double radioInferior, double radioSuperior, int subdivisionesAngulares)
        {
            Glu.GLUquadric cyl = Glu.gluNewQuadric();
            Glu.GLUquadric disk = Glu.gluNewQuadric();

            double r2d = 180.0 / Math.PI;

            double rb = radioInferior;
            double rt = radioSuperior;
            int dth = subdivisionesAngulares;
            int dz = 10;		// nro. de subdivisiones a lo largo (z)

            // vector orientacion
            double vx = p2.X - p1.X;	
            double vy = p2.Y - p1.Y;	
            double vz = p2.Z - p1.Z;

            //Caso especial
            if (vz == 0)
            {
                vz = .00000001;
            }

            double v = Math.Sqrt(vx * vx + vy * vy + vz * vz);	// largo

            // vector rotacion, z x r  
            double rx = -vy * vz;
            double ry = +vx * vz;
            double ax = 0.0;

            double zero = 0.001;
            if (Math.Abs(vz) < zero)
            {
                ax = r2d * Math.Acos(vx / v);	// angulo de rotacion en plano x-y
                if (vx <= 0.0) ax = -ax;
            }
            else
            {
                ax = r2d * Math.Acos(vz / v);	// angulo rotacion
                if (vz <= 0.0) ax = -ax;
            }

            Gl.glPushMatrix();

            Gl.glTranslated(p1.X, p1.Y, p1.Z);	// traslacion al punto 1

            if (Math.Abs(vz) < zero)
            {
                Gl.glRotated(90.0, 0, 1, 0.0);			// roto y alineo con el eje x
                Gl.glRotated(ax, -1.0, 0.0, 0.0);		// roto al punto 2 en el plano x-y
            }
            else
            {
                Gl.glRotated(ax, rx, ry, 0.0);			// roto segun el vector de rotacion
            }

            Glu.gluCylinder(cyl, rb, rt, v, dth, dz);	// dibujo los costados
            Glu.gluDisk(disk, 0.0, rb, dth, 1);		// dibujo el fondo

            Gl.glPopMatrix();

            Gl.glPushMatrix();

            Gl.glTranslated(p2.X, p2.Y, p2.Z);	// traslacion al punto 2

            if (Math.Abs(vz) < zero)
            {
                Gl.glRotated(90.0, 0, 1, 0.0);			// roto y alineo con el eje x
                Gl.glRotated(ax, -1.0, 0.0, 0.0);		// roto al punto 2 en el plano x-y
            }
            else
            {
                Gl.glRotated(ax, rx, ry, 0.0);			// roto segun el vector de rotacion
            }

            Glu.gluDisk(disk, 0.0, rt, dth, 1);		// dibujo el tope

            Gl.glPopMatrix();

            Glu.gluDeleteQuadric(cyl);
            Glu.gluDeleteQuadric(disk);

            return;
        }
    }
       
}
